#include "imagenes.h"

void Imagen::abrirImagen()
{
	string buffer;
	fstream fpgm(_nombre.c_str());
	if(fpgm.good())
	{
		fpgm>>_encabezado;//el tipo de pgm en este caso P2
		fpgm>>buffer;//saco y veo si es un #
		if(buffer=="#")
		{
			getline(fpgm,buffer);//la linea que le sigue al #
			fpgm>>buffer;//la cant de columnas
		}
		_columnas = atoi(buffer.c_str());
		fpgm>>buffer;//la cant de filas
		_filas = atoi(buffer.c_str());
		fpgm>>buffer;//el maximo valor que aparece en la matriz
		_maxValor = atoi(buffer.c_str());

		_laImagen = new Matriz(_filas,_columnas);
		_laImagenModificada = new Matriz(_filas,_columnas);
		double valor;

		for(Indice i=1;i<=_filas;i++)
			for(Indice j=1;j<=_columnas;j++)
			{
				fpgm>>buffer;
				valor = atof(buffer.c_str());
				_laImagen->set(i,j,valor);
			}
	}
	fpgm.close();
	_laImagenModificada->copiarMatriz(_laImagen);
}

void Imagen::guardarImagenModificada()
{
	ofstream fpgm(("modificada_"+_nombre).c_str());
	if(fpgm.good())
	{
		fpgm<<_encabezado<<endl<<_columnas<<" "<<_filas<<endl<<_maxValor<<endl;
		for(Indice i=1;i<=_filas;i++)
			for(Indice j=1;j<=_columnas;j++)
				fpgm<<_laImagenModificada->get(i,j)<<endl;
	}
	fpgm.close();
}

void Imagen::init(string archivoImg,string archivoCoordenada)
{
	_laImagen=NULL;
	_laImgOriginal=NULL;
	_laImagenModificada=NULL;
	_nombre=archivoImg;
	fstream coord(archivoCoordenada.c_str());
	string buffer;
	if(coord.good())
	{
	       coord>>_inicio._ejeX;
	       coord>>_inicio._ejeY;
	       coord>>_fin._ejeX;
	       coord>>_fin._ejeY;
	}
	   coord.close();

	   this->abrirImagen();
}

Imagen::Imagen(string archivoImg,string archivoCoordenada,string archoriginal)
{
	this->init(archivoImg,archivoCoordenada);
	string buffer;
	fstream fpgm(archoriginal.c_str());
	if(fpgm.good())
	{
		fpgm>>buffer;//el tipo de pgm en este caso P2
		fpgm>>buffer;//saco y veo si es un #
		if(buffer=="#")
		{
			getline(fpgm,buffer);//la linea que le sigue al #
			fpgm>>buffer;//la cant de columnas
		}
		fpgm>>buffer;//la cant de filas
		fpgm>>buffer;//el maximo valor que aparece en la matriz
		_laImgOriginal = new Matriz(_filas,_columnas);
		double valor;

		for(Indice i=1;i<=_filas;i++)
			for(Indice j=1;j<=_columnas;j++)
			{
				fpgm>>buffer;
				valor = atof(buffer.c_str());
				_laImgOriginal->set(i,j,valor);
			}
	}
}

Imagen::Imagen(string archivoImg,string archivoCoordenada)
{
	this->init(archivoImg,archivoCoordenada);
}

Matriz* Imagen::dameLaMatrizDeLaImagen()
{
	return _laImagenModificada;
}

void Imagen::escribirImagen()
{
    this->guardarImagenModificada();
}

Tam Imagen::filasDeLaImagen()const
{
	return _filas;
}

Tam Imagen::columnasDeLaImage()const
{
	return _columnas;
}

double Imagen::errorCuadraticoMedio()
{
	double ret=0;
	for(Tam i=_inicio._ejeY;i<=_fin._ejeY;i++)
		for(Tam j=_inicio._ejeX;j<=_fin._ejeX;j++)
			ret+=pow(_laImgOriginal->get(i,j) - _laImagenModificada->get(i,j),2);
	return ret/(_filas*_columnas);
}

coordenada Imagen::dameCoordenadaInicio()const
{
    coordenada res = _inicio;
    return res;
}

coordenada Imagen::dameCoordenadaFin()const
{
    coordenada res = _fin;
    return res;
}

Imagen::~Imagen()
{
	delete _laImagen;
	delete _laImagenModificada;
}
